package me.xiaopan.sketchsample.widget; import android.content.Context; import android.graphics.Color; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Matrix; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.LayoutInflater; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import me.xiaopan.prl.PullRefreshLayout; import me.xiaopan.sketchsample.R; public class MyPullRefreshHeader extends LinearLayout implements PullRefreshLayout.PullRefreshHeader { private ImageView arrowImageView; private ProgressBar progressBar; private TextView hintTextView; private Matrix matrix; // 用来旋转箭头 private int maxDegrees; // 最大旋转角度 private int triggerHeight = -1; // 触发高度 private float px = -1, py = -1; // 旋转中心的坐标 private Status status; // 状态 public MyPullRefreshHeader(Context context) { this(context, null); } public MyPullRefreshHeader(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(getContext()).inflate(R.layout.refresh_header, this); arrowImageView = (ImageView) findViewWithTag("arrowImage"); progressBar = (ProgressBar) findViewWithTag("progressBar"); hintTextView = (TextView) findViewWithTag("hintText"); adjustArrowImageViewPadding(arrowImageView); px = arrowImageView.getDrawable().getIntrinsicWidth() / 2; py = arrowImageView.getDrawable().getIntrinsicHeight() / 2; arrowImageView.setScaleType(ImageView.ScaleType.MATRIX); matrix = new Matrix(); maxDegrees = 180; status = Status.NORMAL; onToNormal(); Drawable arrayDrawable = context.getResources().getDrawable(R.drawable.ic_pull_down); arrayDrawable = arrayDrawable.mutate(); arrayDrawable.setColorFilter(makeResetColorFilter(context.getResources().getColor(R.color.default_text_color_normal))); arrowImageView.setImageDrawable(arrayDrawable); } @Override public void onScroll(int distance) { // 如果当前正在刷新,就什么也不做 if (status == Status.REFRESHING) { return; } // 计算旋转角度并旋转箭头 float degrees; if (distance >= getTriggerHeight()) { degrees = maxDegrees; } else { degrees = ((float) distance / getTriggerHeight()) * maxDegrees; } matrix.setRotate(degrees, px, py); arrowImageView.setImageMatrix(matrix); } @Override public Status getStatus() { return status; } @Override public void setStatus(Status status) { this.status = status; } @Override public void onToWaitRefresh() { arrowImageView.setVisibility(VISIBLE); progressBar.setVisibility(INVISIBLE); hintTextView.setText("松手立即刷新"); } @Override public void onToRefreshing() { arrowImageView.setVisibility(INVISIBLE); progressBar.setVisibility(VISIBLE); hintTextView.setText("正在刷新..."); } @Override public void onToNormal() { arrowImageView.setVisibility(VISIBLE); progressBar.setVisibility(INVISIBLE); hintTextView.setText("下拉刷新"); } @Override public int getTriggerHeight() { // 初始化触发高度 if (triggerHeight == -1) { triggerHeight = getMeasuredHeight(); } return triggerHeight; } /** * 调整箭头图片的内边距,保证在旋转箭头的时候不会被遮盖 */ private void adjustArrowImageViewPadding(ImageView arrowImageView) { if (arrowImageView.getDrawable() == null) { return; } int width = arrowImageView.getDrawable().getIntrinsicWidth(); int height = arrowImageView.getDrawable().getIntrinsicHeight(); int paddingLeft = arrowImageView.getPaddingLeft(); int paddingTop = arrowImageView.getPaddingTop(); int paddingRight = arrowImageView.getPaddingRight(); int paddingBottom = arrowImageView.getPaddingBottom(); if (width > height) { int offset = (width - height) / 2; if (paddingTop < offset) { paddingTop = offset; } if (paddingBottom < offset) { paddingBottom = offset; } } else if (width < height) { int offset = (height - width) / 2; if (paddingLeft < offset) { paddingLeft = offset; } if (paddingRight < offset) { paddingRight = offset; } } arrowImageView.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); } /** * 创建一个可以改变颜色的ColorFilter * * @param color 透明度是没有用的 * @return ColorMatrixColorFilter */ public static ColorMatrixColorFilter makeResetColorFilter(int color) { float mRed = Color.red(color); float mGreen = Color.green(color); float mBlue = Color.blue(color); float[] src = new float[]{ 0, 0, 0, 0, mRed, 0, 0, 0, 0, mGreen, 0, 0, 0, 0, mBlue, 0, 0, 0, 1, 0}; ColorMatrix matrix = new ColorMatrix(); matrix.set(src); return new ColorMatrixColorFilter(src); } }